#!/usr/bin/env bash
# 代码质量检查脚本
# 用于在本地运行与 CI 相同的检查

set -euo pipefail

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查命令是否存在
check_command() {
    if ! command -v "$1" &> /dev/null; then
        log_warn "$1 未安装，跳过相关检查"
        return 1
    fi
    return 0
}

# 运行检查
run_check() {
    local name=$1
    shift
    log_info "运行: $name"

    if "$@" > /dev/null 2>&1; then
        log_info "✓ $name 通过"
        return 0
    else
        log_error "✗ $name 失败"
        return 1
    fi
}

# 主函数
main() {
    log_info "开始代码质量检查"
    log_info "===================="

    # 安装依赖检查
    log_info "检查开发依赖..."
    pip install -q black ruff isort bandit pydocstyle 2>/dev/null || {
        log_warn "部分依赖未安装，将跳过相应检查"
    }

    cd "$(dirname "$0")/.."

    # 统计
    local failed=0
    local passed=0

    # Black 格式检查
    if check_command black; then
        if run_check "Black 格式检查" black --check --diff .; then
            ((passed++))
        else
            ((failed++))
            log_info "尝试自动修复..."
            black . || true
        fi
    fi

    # Ruff Lint
    if check_command ruff; then
        if run_check "Ruff Lint" ruff check .; then
            ((passed++))
        else
            ((failed++))
        fi
    fi

    # Ruff Format 检查
    if check_command ruff; then
        if run_check "Ruff Format 检查" ruff format --check .; then
            ((passed++))
        else
            ((failed++))
            log_info "尝试自动修复..."
            ruff format . || true
        fi
    fi

    # isort 检查
    if check_command isort; then
        if run_check "isort 检查" isort --check-only --diff .; then
            ((passed++))
        else
            ((failed++))
            log_info "尝试自动修复..."
            isort . || true
        fi
    fi

    # Bandit 安全检查
    if check_command bandit; then
        if run_check "Bandit 安全检查" bandit -c pyproject.toml -r .; then
            ((passed++))
        else
            log_warn "发现安全问题，请检查"
            ((failed++))
        fi
    fi

    # pydocstyle 文档字符串检查
    if check_command pydocstyle; then
        if run_check "pydocstyle 检查" pydocstyle .; then
            ((passed++))
        else
            ((failed++))
        fi
    fi

    # Schema 验证
    log_info "运行: Schema 验证"
    if python schemas/scenes_schema.py examples/scence_text.json > /dev/null 2>&1; then
        log_info "✓ Schema 验证通过"
        ((passed++))
    else
        log_error "✗ Schema 验证失败"
        ((failed++))
    fi

    # 提示词模板检查
    log_info "运行: 提示词模板检查"
    if python -c "from prompts.templates import PromptManager; m = PromptManager(); print('✓')" > /dev/null 2>&1; then
        log_info "✓ 提示词模板检查通过"
        ((passed++))
    else
        log_error "✗ 提示词模板检查失败"
        ((failed++))
    fi

    # 缓存模块检查
    log_info "运行: 缓存模块检查"
    if python -c "from utils.cache import CacheManager; print('✓')" > /dev/null 2>&1; then
        log_info "✓ 缓存模块检查通过"
        ((passed++))
    else
        log_error "✗ 缓存模块检查失败"
        ((failed++))
    fi

    # 统计结果
    log_info "===================="
    log_info "检查完成: $passed 通过, $failed 失败"

    if [ $failed -eq 0 ]; then
        log_info "所有检查通过！"
        exit 0
    else
        log_error "存在 $failed 个失败的检查"
        log_info "提示：可以运行 'ruff check --fix .' 来自动修复部分问题"
        exit 1
    fi
}

main "$@"
